package com.rss;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class RssDB {

	private static final String CREA_TABLA_FEEDS = "CREATE TABLE IF NOT EXISTS feeds (feed_id integer primary key autoincrement, "
			+ "titulo text not null, url text not null);";

	private static final String CREA_TABLA_ARTICULOS = "CREATE TABLE IF NOT EXISTS articulos (articulo_id integer primary key autoincrement, "
			+ "feed_id int not null, titulo text not null,contenido text not null, url text not null, leido int not null);";

	private static final String CREA_TABLA_SUGERENCIAS = "CREATE TABLE IF NOT EXISTS sugerencias (sugerencia_id integer primary key autoincrement, "
			+ "titulo text not null,contenido text not null, url text not null);";

	private static final String TABLA_FEEDS = "feeds";
	private static final String TABLA_ARTICULOS = "articulos";
	private static final String TABLA_SUGERENCIAS = "sugerencias";

	private static final String NOMBRE_DB = "rssdb";
	private static final int DATABASE_VERSION = 1;
	private DatabaseHelper mDbHelper;

	private SQLiteDatabase db;
	private Context ctContext;

	private static class DatabaseHelper extends SQLiteOpenHelper {

		DatabaseHelper(Context context) {
			super(context, NOMBRE_DB, null, DATABASE_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(CREA_TABLA_FEEDS);
			db.execSQL(CREA_TABLA_ARTICULOS);
			db.execSQL(CREA_TABLA_SUGERENCIAS);

		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w("Upgrading DB", "Upgrading database from version "
					+ oldVersion + " to " + newVersion
					+ ", which will destroy all old data");
			db.execSQL("DROP TABLE IF EXISTS articulos");
			db.execSQL("DROP TABLE IF EXISTS articulos_tmp");
			db.execSQL("DROP TABLE IF EXISTS feeds");

			onCreate(db);
		}
	}

	public RssDB(Context ctx) {
		this.ctContext = ctx;
	}

	public RssDB open() throws SQLException {
		mDbHelper = new DatabaseHelper(ctContext);
		db = mDbHelper.getWritableDatabase();
		return this;

	}

	public void close() {
		mDbHelper.close();
	}

	public boolean insertarFeed(String titulo, URL url) throws SQLException {
		ContentValues valores = new ContentValues();
		valores.put("titulo", titulo);
		valores.put("url", url.toString());
		return (db.insert(TABLA_FEEDS, null, valores) > 0);

	}

	public boolean insertarArticulo(Long feedId, String titulo, URL url,
			String contenido) {

		// TODO borrar los leidos , insertar si no esta

		ContentValues valores = new ContentValues();
		valores.put("feed_id", feedId);
		valores.put("titulo", titulo);
		valores.put("contenido", contenido);
		valores.put("url", url.toString());
		valores.put("leido", 0);
		boolean b = false;
		Cursor c = db.query(TABLA_ARTICULOS, new String[] { "feed_id", "url" },
				"url='" + url.toString() + "' AND feed_id="+ feedId.toString(), null, null, null, null);
		int apariciones = c.getCount();
		c.close();
		if (apariciones == 0) {
			b = (db.insert(TABLA_ARTICULOS, null, valores) > 0);
		}

		return b;
	}

	public boolean insertarSugerencia(String titulo, URL url, String contenido) {

		// TODO borrar los leidos , insertar si no esta

		ContentValues valores = new ContentValues();
		valores.put("titulo", titulo);
		valores.put("contenido", contenido);
		valores.put("url", url.toString());
		boolean b = false;
		b = (db.insert(TABLA_SUGERENCIAS, null, valores) > 0);

		return b;
	}
//	public boolean existeSugerencia(String url){
//		Cursor c = db.query(TABLA_SUGERENCIAS, new String[] { "url" },
//				"url='" + url + "'", null, null, null, null);
//		int apariciones = c.getCount();
//		c.close();
//		
//		return (apariciones > 0);
//	}

	public boolean borrarSugerencias() {
		
		return (db.delete(TABLA_SUGERENCIAS, null, null) > 0);
	}

	public boolean borrarFeed(Long feedId) {
		boolean b = false;

		// borra el feed con una id determinada , y luego en la tabla articulos
		// , los que tengan ese feed_id
		b = (db.delete(TABLA_FEEDS, "feed_id=" + feedId.toString(), null) > 0);
		b = b && (db.delete(TABLA_ARTICULOS, "feed_id=" + feedId.toString(), null) > 0);
		return b;
	}

	public boolean borrarArticulos(Long feedId) {
		return true; // (db.delete(TABLA_ARTICULOS, "feed_id=" +
		// feedId.toString() + " AND leido=1", null) > 0);
	}

	public List<Feed> obtenerFeeds() {

		ArrayList<Feed> feeds = new ArrayList<Feed>();
		Cursor c = null;
		String[] columnas = { "feed_id", "titulo", "url" };
		try {

			c = db.query(TABLA_FEEDS, columnas, null, null, null, null, null);

			c.moveToFirst();
			int i = 0;
			while (i < c.getCount()) {

				Feed feed = new Feed();
				feed.feedId = c.getLong(0);
				feed.titulo = c.getString(1);
				feed.url = new URL(c.getString(2));
				feeds.add(feed);
				i++;
				c.moveToNext();
			}
			c.close();

		} catch (SQLException e) {
			Log.e("RSSREADER salta1", e.toString());
		} catch (MalformedURLException e) {
			Log.e("RSSREADER salta2", e.toString());
		}
		return feeds;
	}

	public List<Articulo> getArticulos(Long feedId) {
		ArrayList<Articulo> articulos = new ArrayList<Articulo>();
		try {
			Cursor c = db.query(TABLA_ARTICULOS, new String[] { "articulo_id",
					"feed_id", "titulo", "url", "contenido", "leido" },
					"feed_id=" + feedId.toString(), null, null, null, null);

			// TODO se salta el 1er articulo
			// c.moveToFirst();
			String s = String.valueOf(c.getCount());
			Log.d("CANTIDAD", s);
			while (c.moveToNext()) {
				Articulo articulo = new Articulo();
				articulo.articuloId = c.getLong(0);
				articulo.feedId = c.getLong(1);
				articulo.titulo = c.getString(2);
				articulo.url = new URL(c.getString(3));
				articulo.contenido = c.getString(4);
				articulo.leido = c.getInt(5);
				articulos.add(articulo);
			}
			c.close();
		} catch (SQLException e) {
			Log.e("RSSREADER salta 1", e.toString());
		} catch (MalformedURLException e) {
			Log.e("RSSREADER salta 2", e.toString());
		}
		return articulos;
	}

	public List<Articulo> getSugerencias() {
		ArrayList<Articulo> articulos = new ArrayList<Articulo>();
		try {
//			Cursor c = db.query(TABLA_SUGERENCIAS, new String[] {
//					"sugerencia_id", "titulo", "url", "contenido" }, null,
//					null, null, null, null);
			Cursor c = db.rawQuery("select distinct sugerencia_id,titulo,url,contenido from "+TABLA_SUGERENCIAS+";--", null);
			String s = String.valueOf(c.getCount());
			Log.d("CANTIDAD", s);
			while (c.moveToNext()) {
				Articulo articulo = new Articulo();
				articulo.articuloId = c.getLong(0);
				articulo.titulo = c.getString(1);
				articulo.url = new URL(c.getString(2));
				articulo.contenido = c.getString(3);
				articulos.add(articulo);
			}
			c.close();
		} catch (SQLException e) {
			Log.e("RSSREADER salta 1", e.toString());
		} catch (MalformedURLException e) {
			Log.e("RSSREADER salta 2", e.toString());
		}
		return articulos;
	}

	// TODO funcion para actualizar los feed con los elementos diferentes
	public List<Articulo> actualizarFeed(Long feedId) {
		ArrayList<Articulo> articulos = new ArrayList<Articulo>();
		try {
			Cursor c = db.query(TABLA_ARTICULOS, new String[] { "articulo_id",
					"feed_id", "titulo", "url", "contenido" }, "feed_id="
					+ feedId.toString(), null, null, null, null);

			Log.e("COUNT TTTTTTT1111111", String.valueOf(c.getCount()));

			// TODO se salta el 1er articulo
			// c.moveToFirst();
			while (c.moveToNext()) {
				Articulo articulo = new Articulo();
				articulo.articuloId = c.getLong(0);
				articulo.feedId = c.getLong(1);
				articulo.titulo = c.getString(2);
				articulo.url = new URL(c.getString(3));
				articulo.contenido = c.getString(4);
				articulos.add(articulo);
			}
			c.close();
		} catch (SQLException e) {
			Log.e("RSSREADER salta 1", e.toString());
		} catch (MalformedURLException e) {
			Log.e("RSSREADER salta 2", e.toString());
		}
		return articulos;
	}

	public void marcaArticuloLeido(Long articuloId) {

		ContentValues valores = new ContentValues();
		valores.put("leido", 1);

		db.update(TABLA_ARTICULOS, valores, "articulo_id=" + articuloId, null);

	}
	public void marcaTodosArticuloLeido(Long feed_id) {

		ContentValues valores = new ContentValues();
		valores.put("leido", 1);
		db.update(TABLA_ARTICULOS, valores, "feed_id=" + feed_id, null);


	}

	public Map<Long, Long> articulosSinleer() {
		Map<Long, Long> m = new HashMap<Long, Long>();
		String consulta = "select count(*),feed_id from articulos where leido = 0 group by feed_id;--";
		Cursor c = db.rawQuery(consulta, null);

		while (c.moveToNext()) {
			m.put(c.getLong(1), c.getLong(0));
		}
		c.close();
		return m;
	}

	public String sugerirPalabra() {

		String palabra = null;
		int nAzar = 0;
		int cuenta = 0;
		Random rnd = new Random();
		try {

			// Obtener numero articulos en la tabla
			String consultaCuenta = "select count(*) AS total from articulos;--";
			Cursor cCuenta = db.rawQuery(consultaCuenta, null);
			cCuenta.moveToFirst();
			cuenta = cCuenta.getInt(0);
			cCuenta.close();
			// Numero aleatorio 0 - cuenta
			nAzar = (int) (rnd.nextDouble() * cuenta);
			if (nAzar == 0)
				nAzar = 1;
			// Consulta de un articulo
			String consulta = "select titulo,contenido from articulos limit "+ (nAzar - 1) + "," + nAzar + " ;--";
			// String
			// consulta="select titulo,contenido from articulos limit 0,1;--";
			Cursor cArticulos = db.rawQuery(consulta, null);
			cArticulos.moveToFirst();
			palabra = URLEncoder.encode(cArticulos.getString(0));
			cArticulos.close();

		} catch (SQLException e) {
			Log.e("RSSREADER salta 1", e.toString());
		}
		return palabra;

	}

	// public String sugerirPalabra() {
	//
	// String palabra = null;
	// int nAzar = 0;
	// int cuenta = 0;
	// Random rnd = new Random();
	// try {
	//			
	// // Obtener numero articulos en la tabla
	// String consultaCuenta = "select count(*) AS total from articulos;--";
	// Cursor cCuenta = db.rawQuery(consultaCuenta, null);
	// //cuenta = c.getInt(c.getColumnIndex("total"));
	// //cuenta = cCuenta.getInt(0);
	// cuenta=5;
	//			
	// //Numero aleatorio 0 - cuenta
	// nAzar = (int) (rnd.nextDouble() * cuenta);
	// if(nAzar==0)
	// nAzar=1;
	// // Consulta de un articulo
	// String consulta = "select titulo,contenido from articulos limit "+ (nAzar
	// - 1) + "," + nAzar +";";
	// //String consulta="select titulo,contenido from articulos limit 0,1;--";
	// Cursor cArticulos = db.rawQuery(consulta, null);
	// cArticulos.moveToFirst();
	// String titulo = cArticulos.getString(0);
	// String contenido = cArticulos.getString(1);
	// palabra=sugerirPalabraAux(titulo,contenido);
	//
	//			
	//			
	//			
	//			
	// } catch (SQLException e) {
	// Log.e("RSSREADER salta 1", e.toString());
	// }
	//
	// return palabra;
	//
	// }
	//	
	// private String sugerirPalabraAux(String titulo,String contenido){
	//		
	//		
	// int palabraMaxima = 0;// indice de la palabra max.
	// //TODO
	// /* Entre todas las palabras del titulo a un array
	// * recorre el array comprobando si estan en el articulo
	// * la que esté es la palabra a buscar.
	// * */
	// titulo = titulo.toLowerCase();
	// contenido = contenido.toLowerCase();
	// String[] palabrasTitulo = titulo.split("\\ ");
	//		
	// int[] apariciones = new int[palabrasTitulo.length];
	//		
	// for(int i = 0 ; i < palabrasTitulo.length; i++){
	// apariciones[i]=0;
	// }
	// for(int i = 0 ; i < palabrasTitulo.length; i++){
	// if(palabrasTitulo[i].length() > 3){
	// apariciones[i] = ( contenido.length() -
	// (contenido.replaceAll(palabrasTitulo[i],"")).length() ) /
	// palabrasTitulo[i].length(); // apariciones de la palabra i en el
	// contenido
	// if(apariciones[i]>=apariciones[palabraMaxima]) // si las aparicio de
	// i-esima >= que la antigua maxima actualizo
	// palabraMaxima=i;
	// }
	// }
	//			
	//
	// return palabrasTitulo[palabraMaxima];
	// }

}
